
// 通过 spawn 的方式执行 electron-forge 的打包命令
import { ChildProcess, spawn } from "child_process";
import os from 'os'
import fs from 'fs'
import * as path from 'path';

// 递归拷贝文件夹及其内容  
function copyDirSync(src, dest) {
    // 确保目标目录存在  
    if (!fs.existsSync(dest)) {
        fs.mkdirSync(dest, { recursive: true });
    }

    fs.readdirSync(src).forEach(file => {
        const srcFile = path.join(src, file);
        const destFile = path.join(dest, file);

        // 递归拷贝子目录  
        if (fs.lstatSync(srcFile).isDirectory()) {
            copyDirSync(srcFile, destFile);
        } else {
            // 拷贝文件  
            fs.copyFileSync(srcFile, destFile);
        }
    });
}


// 拷贝 electron 文件到打包目录（build)
const copyElectronFile = () => {
    // 拷贝electron编译后文件按到build目录
    const sourceDir = path.join(__dirname, '../electron');
    const destinationDir = path.join(__dirname, '../build');

    copyDirSync(sourceDir, destinationDir);
    console.log('electron文件夹及其内容拷贝完成！');
}

// 思路 ： 先等vite 打完包，然后再执行 electron的打包动作
// 因为，electron 打包是需要用到 vue 打包之后的 index.html 文件的
export const ElectronBuildPlugin = () => {
    return {
        name: 'electron-build-plugin',
        closeBundle() {
            console.log('vite-vue 打包完成')

             // 执行 electron 的 拷贝动作
             copyElectronFile();

            // 先把之前的打包的文件删除
            let dirFlag = fs.existsSync('out')
            if (dirFlag) {
                console.log('plugins-build : out目录存在，已删除')
                fs.rmSync('out', { recursive: true })
            } else {
                console.log('plugins-build : out 目录不存在')
            }
            // 下面执行命令进行electron的打包
            const platform = os.platform();

            if (platform === 'win32') {
                console.log('当前运行环境是 Windows');
                // windows 上需要执行这种方式
                // let buildChildProcess = spawn('npm.cmd',['run','make'], { stdio: 'inherit' })
                let buildChildProcess = spawn('npm.cmd', ['run', 'make'], {  
                    stdio: 'inherit', // 继承父进程的输入输出流  
                    shell: true,      // 在 Windows 上，通常需要将此选项设置为 true 以正确解析命令  
                    env: process.env   // 确保子进程继承了父进程的环境变量  
                  });  
            
            } else if (platform === 'darwin') {
                console.log('当前运行环境是 Mac');
                // Mac上可以执行这种方式
                // let buildChildProcess = spawn('electron-forge',['make'],{stdio: 'inherit'})
                let buildChildProcess = spawn('npm', ['run', 'make'], { stdio: 'inherit' })
            } else if (platform === 'linux') {
                console.log('当前运行环境是 linux');
                let buildChildProcess = spawn('npm', ['run', 'make'], { stdio: 'inherit' })
            } else {
                console.log('其他平台 : ', platform, '【暂不支持打包】');
            }

        },
    }
}

